#!/bin/bash
#
# This is a small utility that helps run and diff benchmarks, using
# "go test -bench" and "benchcmp".
#
# It's only used for development and not meant to be portable, or have a
# stable interface.
#
# Examples:
#   # Run the benchmarks, recording the output IFF the tree is not dirty.
#   ./tests/bench
#
#   # Diff between two recorded commits.
#   ./tests/bench diff 8b25916 HEAD
#
#   # Run the benchmarks without recording, and compare against a commit.
#   ./tests/bench rundiff 8b25916
#

set -e

cd "$(git rev-parse --show-toplevel)"

BDIR=".bench-history"

# Get a filename based on the current commit.
function commit_fname() {
	git log --date=format:"%F-%H:%M" --pretty=format:"%cd__%h__%f" -1 $1
}


MODE=bench
RUN_COUNT=3
BEST=
NO_RECORD=

# Don't record results for a dirty tree.
# Note this tool is explicitly excluded so we can easily test old commits.
DIRTY=$(git status --porcelain | grep -v tests/bench | grep -v "^??" | wc -l)
if [ "$DIRTY" -gt 0 ]; then
		echo "Dirty tree, not recording results"
		NO_RECORD=1
fi

while getopts "m:c:1rbn" OPT ; do
	case $OPT in
		m)
			MODE=$OPTARG
			;;
		1)
			RUN_COUNT=1
			;;
		c)
			RUN_COUNT=$OPTARG
			;;
		b)
			BEST="-best"
			;;
		n)
			NO_RECORD=1
			;;
		\?)
			exit 1
			;;
	esac
done

shift $((OPTIND-1))

if [ $1 ]; then
	MODE=$1
	shift
fi

if [ $MODE == bench ]; then
	FNAME=$BDIR/$(commit_fname)
	RAWFNAME=$BDIR/.$(commit_fname).raw

	if [ $NO_RECORD ]; then
		go test -run=NONE -bench=. -benchmem ./...
		exit
	fi

	echo -n "Running: "
	echo > "$RAWFNAME"
	for i in `seq $RUN_COUNT`; do
		go test -run=NONE -bench=. -benchmem ./... >> "$RAWFNAME"
		echo -n "$i "
	done
	echo

	# Filter and sort the results to make them more succint and easier to
	# compare.
	cat "$RAWFNAME" | grep allocs | sort > "$FNAME"

	cat "$FNAME"

elif [ $MODE == diff ]; then
	F1=$BDIR/$(commit_fname $1)
	F2=$BDIR/$(commit_fname $2)
	benchcmp $BEST "$F1" "$F2"

elif [ $MODE == rundiff ]; then
	TMPF=$(mktemp)
	F1=$BDIR/$(commit_fname $1)

	go test -run=NONE -bench=. -benchmem ./... > $TMPF
	benchcmp -best "$F1" "$TMPF"

	rm $TMPF

elif [ $MODE == ls ]; then
	cd $BDIR
	ls -1
else
	echo "Unknown mode $MODE"
	exit 1
fi

